#include <stdio.h>
#include <stdlib.h>
#include "EstructurasPrueba.h"
#include "FuncionesAuxiliares.c"
#include "logging.c"

t_chs CHS;
FILE * archivoLogueo;
int descriptorArchivo;
const char * nombreDelProceso = "PPD";
unsigned char nivelDeLog = LOG_INFO;
t_nodo * colaFte;
t_nodo * colaFin;

void imprimirColaDePedidos(t_nodo *, t_nodo *, int *);
void imprimirSectoresRecorridosLogueo(t_nodo *, int *, int *);
void logueo(t_nodo *);
int main (void) {

CHS.pista = 0;  //prueba
CHS.sector = 0; //prueba
long pista = 0;
long sector = 0; //prueba
int i = 0;
char * datos;
unsigned char tipo = 0;
t_nodo * nodoSolicitado = NULL;
colaFin = NULL;
colaFte = NULL;

char nombre[30] = "archivoLogueo.txt";   //nombre del archivo

archivoLogueo = fopen(nombre, "w"); //abro el archivo

descriptorArchivo = fileno(archivoLogueo);

if(archivoLogueo) printf( "creado (ABIERTO)\n" );  //compruebo si se abrio o no
else printf( "Error (NO ABIERTO)\n" );

while (i != -1){

printf("ingresar pista \n");
scanf("%lu", &pista);

printf("ingresar nroSector \n");
scanf("%lu", &sector);

printf("Si este es el ultimo nodo de la cola ingrese -1, sino 0 \n");
scanf("%d", &i);

meterEnCola(&colaFte, &colaFin, sector, datos, tipo, pista);

}
while (colaFte != 0) {
nodoSolicitado = algoritmoCSCAN(&colaFte, &colaFte);
logueo (nodoSolicitado);
}
fclose(archivoLogueo);
return 0;
}

void logueo(t_nodo * nodoSolicitado){

int T_SaltoSector = 1;  //hardcodiado lo que le sigue
int T_SaltoPista = 10;
int tiempoConsumido = 0;
int  cantSecRec = 0;
int  cantPisRec = 0;
int tamano = 0;
t_nodo * nodoSolicitadoSiguiente = NULL;

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Cola de Pedidos: ");
imprimirColaDePedidos(colaFte, colaFin, &tamano);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, " ");
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Tamaño: %d \n", tamano);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Posición Actual: %lu:%lu \n", CHS.pista, CHS.sector);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Sector Solicitado: %lu:%lu \n", nodoSolicitado->pista, nodoSolicitado->nroSector);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Sectores Recorridos: ");
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, " ' ' ");
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "[" );
imprimirSectoresRecorridosLogueo(nodoSolicitado, &cantSecRec, &cantPisRec);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "] \n");
tiempoConsumido = (cantPisRec * T_SaltoPista) + (cantSecRec * T_SaltoSector);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Tiempo Consumido: %d ms \n", tiempoConsumido);
nodoSolicitadoSiguiente = busquedaAlgoritmoCSCAN(&colaFte, &colaFin);

if(nodoSolicitadoSiguiente == NULL){
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Proximo Sector: ...");
}
else {
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Proximo Sector: %lu:%lu \n", nodoSolicitadoSiguiente->pista, nodoSolicitadoSiguiente->nroSector);
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "\n\n");
}
}

void imprimirColaDePedidos(t_nodo * colaFte, t_nodo * colaFin, int * tamano){

t_nodo * ptr = colaFte;

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "[");

while (ptr){
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%lu:%lu,", ptr->pista, ptr->nroSector);
	(*tamano) ++;
	ptr = ptr->siguiente;
}

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "]");
}

void imprimirSectoresRecorridosLogueo(t_nodo * nodoSolicitado, int * cantSecRec, int * cantPisRec){

int salir  = 0;
long cantidadPistas  = 10;
long cantSecPorPista = 10;
*cantSecRec = 0;
*cantPisRec = 0;

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%lu:%lu,", CHS.pista, CHS.sector);
if ((nodoSolicitado->pista == CHS.pista) && (nodoSolicitado->nroSector == CHS.sector))
	salir = 1;

else{


if (nodoSolicitado->pista >= CHS.pista) {
    while(!salir){
        while(CHS.pista != nodoSolicitado->pista){ //mientras no encuentre la pista solicitada
            if(CHS.pista == cantidadPistas - 1){
                CHS.pista = 0;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantPisRec) ++;
            }
            else {
                CHS.pista = CHS.pista + 1;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
                (*cantPisRec) ++;
            }
        }

        while(CHS.sector != nodoSolicitado->nroSector){// mientras no encuentre el sector solicitado
            if(CHS.sector == cantSecPorPista - 1){
                CHS.sector = 0;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantSecRec) ++;
            }
            else{
                CHS.sector = CHS.sector + 1;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%c%lu:%lu,",' ', CHS.pista, CHS.sector);
                (*cantSecRec) ++;
            }
            salir = 1;
        }
     }
}

else {
    while(!salir){
        while(CHS.pista != nodoSolicitado->pista){//mientras no encuentre la pista solicitada
        	CHS.pista = CHS.pista - 1;
        	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
            (*cantPisRec) ++;
        }
        while(CHS.sector != nodoSolicitado->nroSector){//mientras no encuentre el sector solicitado
            if (CHS.sector == cantSecPorPista - 1) {
                CHS.sector = 0;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantSecRec) ++;
            }
            else{
                CHS.sector = CHS.sector + 1;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantSecRec) ++;
            }
        salir = 1;
        }
    }
}
}
}
